package main

import (
	"encoding/json"
	"fmt"
)

// 结构体 与 JSON 互转

type Person struct {
	// 字段可见性 同标识符一样 与 首字母 大小写 有关
	// 小写开头 的 字段 不会被 json.Marshal 解析
	// 使用 tag 标签 标识需要转换的字段名
	Name string `json:"name" db:"name" yaml:"name"`
	Age  int    `json:"age"`
}

func main() {
	p1 := &Person{
		Name: "张三",
		Age:  20,
	}
	fmt.Printf("p1: %#v\n", p1)

	fmt.Println("=========================================================")

	// 序列化 结构体 => JSON
	j1, _ := json.Marshal(p1)
	fmt.Println(string(j1))

	fmt.Println("=========================================================")

	// 反序列化 JSON => 结构体
	p2 := new(Person)
	j2 := "{\"name\":\"李四\",\"age\":18}"

	// 需传入 结构体 指针
	_ = json.Unmarshal([]byte(j2), p2)
	fmt.Printf("p2: %#v\n", p2)
}
